// 这是仅仅只是理解，后面结合epoll讲具体应用
// 如何设计非阻塞，可以将fd直接设置为非阻塞，可以通过fcntl接口
#include <fcntl.h>
#include <unistd.h>
#include <iostream>

#include <string.h>
#include <errno.h>

void SetNoBlock(int fd)
{
    int flag = fcntl(fd, F_GETFD); // F_GETD获取里面的标志位
    if (flag < 0)
    {
        perror("fcntl");
        return;
    }
    fcntl(fd, F_SETFL, flag | O_NONBLOCK); // F_SETFL设置里面的标志位  O_
}
int main()
{
    SetNoBlock(0);
    char buffer[64];
    while (true)
    {
        sleep(1);
        int n = read(0, buffer, sizeof(buffer) - 1);
        if (n > 0)
        {
            buffer[n] = 0;
            printf("input: %s\n", buffer);
        }
        else if (n == 0)
        {
            // 在网络里面0为对端关闭，但在这里是读到文件结尾
            std::cout<<" read end "<<std::endl;
        }
        else
        {
            if(errno ==EWOULDBLOCK)
            {
                continue;//此时是非阻塞造成的读取失败
            }
            if(errno == EINTR)
            {
                continue;//此时是中断早层的读取失败
            }
            printf("erron:%d read ret: %d  strerron:%s \n", n, errno, strerror(errno));
        }
    }
}